from transformers import BertTokenizer, BertForSequenceClassification
# 加载预训练的BERT模型和分词器
model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=num_labels)  
# num_labels是你的分类任务中的类别数微调模型

import torch
import torch.nn as nn
import torch.optim as optim

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()  # 适用于多分类问题的损失函数
optimizer = optim.Adam(model.parameters(), lr=1e-5) 
# 使用Adam优化器，学习率设为1e-5训练循环

# 假设我们有一个DataLoader实例叫做train_dataloader
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

model.train()  # 设置模型为训练模式

for epoch in range(num_epochs):
    for inputs, labels in train_dataloader:
        # 将数据和标签移动到正确的设备（CPU或GPU）
        inputs, labels = inputs.to(device), labels.to(device)

        # 清除之前的梯度
        optimizer.zero_grad()

        # 前向传播
        outputs = model(inputs, labels=None)  # 注意：某些模型可能需要不同的输入格式
        loss = criterion(outputs, labels)

        # 反向传播和优化
        loss.backward()
        optimizer.step()

    # 在每个epoch结束时，可以在验证集上进行评估（这里省略）
# ...
